package com.bowlong.util;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.concurrent.CopyOnWriteArrayList;

@SuppressWarnings("serial")
public class SortedCopyOnWriteArrayList<T> extends CopyOnWriteArrayList<T> {
	protected Comparator<T> c;

	public SortedCopyOnWriteArrayList(Comparator<T> c) {
		this.c = c;
	}

	@Override
	public boolean add(T e) {
		int insertionPoint = Collections.binarySearch(this, e, c);
		super.add((insertionPoint > -1) ? insertionPoint
				: (-insertionPoint) - 1, e);
		return true;
	}

	@Override
	public boolean addAll(Collection<? extends T> c) {
		for (T e : c) {
			add(e);
		}
		return true;
	}

	// static class User {
	// int id;
	// String name;
	// int order = 0;
	//
	// public User(int id, String name, int order) {
	// super();
	// this.id = id;
	// this.name = name;
	// this.order = order;
	// }
	//
	// @Override
	// public String toString() {
	// return "User [id=" + id + ", name=" + name + ", order=" + order
	// + "]";
	// }
	// }
	//
	// public static void main(String[] args) {
	// Comparator<User> c = new Comparator<User>() {
	// @Override
	// public int compare(User o1, User o2) {
	// // int r2 = o2.order - o1.order; // 反序
	// int r2 = o1.order - o2.order; // 正序
	// return r2;
	// }
	// };
	// SortedList<User> list = new SortedList<User>(c);
	// for (int i = 0; i < 100; i++) {
	// int order = RndEx.nextInt(1000);
	// User e = new User(i, "name-" + i, order);
	// list.add(e);
	// }
	// for (User user : list) {
	// System.out.println(user);
	// }
	// }
}
